#include "trie.h"
#include "listaP.h"
#include <stdlib.h>

extern const char* caracteres_de_tecla(char tecla);

// Completar las funciones en C.
void copioAlBuffer(char *buf, char* val, char t){

	int i = 0;


	while(*val){

		buf[i] = *val;
		val++;
		i++;

	}

	buf[i] = t;
	buf[i+1] = 0;
}



listaP* AgregarATodos(listaP *ls, char tecla){


	const char *aux =  caracteres_de_tecla(tecla);
	const char *aux2 = aux;

	lsnodo *aux_ls = ls->prim;
	char buffer[1024];

	if(ls -> prim == 0){ //si la lista es vacía agrego cada uno de los caracteres

		while(*aux){
			
			buffer[0] = *aux;
			buffer[1] = 0;		
			lista_agregar(ls, &buffer[0]);
			aux++;
		}	

		free((void*)aux2);
		return ls;		

	}

	else{

		listaP * lss = lista_crear();	
		while(*aux){

			while(aux_ls){
			
				copioAlBuffer(&buffer[0],aux_ls->valor,*aux);
				lista_agregar(lss, &buffer[0]);
				aux_ls = aux_ls -> sig;
		
			}
	
			aux_ls = ls->prim;
			aux++;

	
		}
	

		free((void*)aux2);
		lista_borrar(ls);
		return lss;
												
	} 

}

listaP* combinaciones(listaP* ls, char* teclas){


	if(*teclas == 0){

		return ls;
	}	

	else {

		ls = AgregarATodos(ls, *teclas);
		teclas++;
		return combinaciones(ls,teclas);

	}

}


listaP *predecir_palabras(trie* t, char* teclas) {
	// COMPLETAR AQUI EL CODIGO


	listaP *ls = lista_crear();
	listaP *lss = lista_crear();

	ls = combinaciones(ls,teclas);		

	lsnodo* nodo = ls ->prim;

	while(nodo){

		lista_concatenar(lss,palabras_con_prefijo(t,nodo->valor));
		nodo = nodo->sig;


	}


	lista_borrar(ls);	
	return lss;
	

}

double peso_palabra(char *palabra) {
	// COMPLETAR AQUI EL CODIGO

	double sum = 0;
	int i = 0;

	while(*palabra){

		sum = sum + (double)*palabra;	
		i++;
		palabra++;

	}

	return sum/i;

}
